// 创建 check.h 头文件
#ifndef CHECK_H
#define CHECK_H
#include <iostream>
#include <vector>
#include <map>
#include <regex>
#include <set>
#include <cctype>
#include <algorithm>
#include <string>
#include <sstream>
#include "http.h"  // 包含HttpRequest类的头文件
using namespace std;
// 正则表达式模式定义
const vector<string> TRAVERSAL_PATTERNS = {
    // 匹配双重编码的 `%255c`（即 `%5c` 的编码）
    R"(%25(?:5[cC]|2[fF]))",  // 匹配 %255c 或 %252f
    // 匹配单层编码的 `%5c` 或 `%2f`
    R"(%(?:5[cC]|2[fF]))",    // 匹配 %5c 或 %2f
    // 匹配原始路径遍历（../ 或 ..\）
    R"(\.\.[/\\])",
    // 匹配敏感文件（win.ini 等）
    R"(windows[/\\]win\.ini)"
};

const std::vector<std::string> SQL_KEYWORDS = {
    // 基础SQL关键字
    R"(\b(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|EXEC|UNION)\b)",
    
    // 条件语句
    R"(\b(OR|AND)\s+[\w']+\s*=\s*[\w']+)",
    R"(\b(OR|AND)\s+\d+\s*=\s*\d+)",
    
    // 注释和终止符
    R"(--|\#|\/\*)",  // SQL注释
    R"(;\s*--)",      // 语句终止加注释
    R"('\s*(OR|AND)\s+['\d])",
    
    // 系统函数
    R"(\b(WAITFOR|DELAY|SLEEP|BENCHMARK)\s*\()",
    
    // 联合查询
    R"(\bUNION\s+SELECT\b)",
    
    // 系统表
    R"(\b(INFORMATION_SCHEMA|sys\.databases|sys\.tables)\b)",
    
    // 简化的攻击模式
    R"('\s*OR\s*'\w'\s*=\s*'\w')",  // ' OR 'a'='a
    R"(\d\s*OR\s*\d\s*=\s*\d)",     // 1 OR 1=1
    R"(';?\s*(DROP|ALTER|DELETE))"   // '; DROP TABLE
};

const vector<string> XSS_PATTERNS = {
    // 基本HTML标签
    R"(<script[\s>])",                     // <script> 标签
    R"(<\/script[\s>])",                   // </script> 标签
    R"(<iframe[\s>])",                     // <iframe> 标签
    R"(<img[\s]+[^>]*src[\s]*=)",         // <img src=> 属性
    
    // JavaScript相关
    R"(javascript[\s]*:)",                 // javascript: 伪协议
    R"(on(load|error|click|mouseover)\s*=)", // 事件处理器
    
    // 危险函数调用
    R"(eval\s*\()",                        // eval() 函数
    R"(document\.(write|innerHTML)\s*\()", // DOM操作
    
    // 特殊编码
    R"(&#x?[0-9a-f]+;?)",                  // HTML实体编码
    R"(\\x[0-9a-f]{2})",                   // 十六进制编码
    
    // 属性注入
    R"((href|src|action)\s*=\s*['"]\s*javascript:)", // 属性中的JS
    
    // 简化的模板注入
    R"(\{\{.*\}\})",                       // 模板语法
    R"(<%.*%>)",                           // 服务器端模板
};

const std::vector<std::string> CMD_CHARS = {
    
    // 危险命令
    R"(\b(rm|sh|bash|cmd|powershell|wget|curl|nc|netcat|telnet|ftp|ssh)\b)",
    
    // 文件操作
    R"(\b(cat|ls|dir|type|more|less|head|tail|chmod|chown)\b)",
    
    // 系统信息
    R"(\b(ps|whoami|id|uname|ifconfig|ipconfig|netstat)\b)",
    
    // 网络工具
    R"(\b(ping|nslookup|dig|traceroute|tracert)\b)",

    
    // Windows特定
    R"(\b(del|copy|move|rename|taskkill|reg)\b)",
    
    // 特殊模式
    R"(\b(echo|printf)\s+.+?\s*[>|&])" // echo恶意内容重定向
};

const std::vector<std::string> HEADER_INJECTION_PATTERNS = {
    // 换行符注入(CRLF)
    R"((%0D%0A|[\r\n]+)\s*(?:Location|Set-Cookie|Content-Length|Refresh):)", 
    
    // 请求头伪造
    R"(^[\w-]+:\s*[^\r\n]*(?:\r?\n[\w-]+:\s*[^\r\n]*)*$)", // 多头部伪造
    
    // 特殊控制字符
    R"([\x00-\x1F\x7F])",  // ASCII控制字符
    
    // 常见注入关键词
    R"(\b(HTTP/\d\.\d|GET|POST|PUT|DELETE|HEAD|OPTIONS)\b)", // 请求行关键词
    
    // 协议/路径注入
    R"(https?://[^\s]+)",  // URL注入
    R"(\s+/[\w/]*)",       // 路径注入
    
    // 头部分隔符滥用
    R"([\s,;:]+[\w-]+\s*=\s*[^;,\s]+)", // 头部分隔符
    
    // 特殊头名称
    R"(X-[\w-]+:)",        // 自定义头部
    
    // 响应头篡改
    R"(Location:\s*[^\r\n]*)",
    R"(Set-Cookie:\s*[^\r\n]*)",
    
    // 编码注入
    R"(%[0-9a-fA-F]{2})",  // URL编码
    R"(&#x?[0-9a-fA-F]+;?)" // HTML实体编码
};
    
// 新增检测模式
const vector<string> OPEN_REDIRECT_PATTERNS = {
    R"(\b(?:redirect|url|next|target)\s*=\s*(https?://[^&\s]+))",
    R"(\b(?:redirect|url|next|target)\s*=\s*(?:\.\./)+)",
    R"(\b(?:redirect|url|next|target)\s*=\s*/[^/]+/[^/]+/)"
};

const vector<string> XXE_PATTERNS = {
    R"(<!DOCTYPE\s+[^\[]*?\[)",
    R"(<!ENTITY\s+%\s+)",
    R"(%\s*;)",
    R"(SYSTEM\s*['\"]\s*(?:https?|ftp|file):)"
};

const vector<string> SSRF_PATTERNS = {
    R"(\b(?:localhost|127\.0\.0\.1|::1)\b)",
    R"(\b10\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)",
    R"(\b192\.168\.\d{1,3}\.\d{1,3}\b)",
    R"(\b172\.(?:1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}\b)",
    R"(\b(?:file|gopher|expect):/)"
};

const vector<string> SENSITIVE_PARAMS = {
    "password", "passwd", "secret", "api_key", "access_token", "token"
};

// 方法检测 - 使用枚举值
const vector<HttpRequest::Method> ALLOWED_METHODS = {
    HttpRequest::Method::GET,
    HttpRequest::Method::POST,
    HttpRequest::Method::HEAD,
    HttpRequest::Method::OPTIONS
};
string check(const HttpRequest& http);

#endif // CHECK_H